/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package analiseSintatica.Regras.Comandos;

import AnaliseLexicaFinal.EstruturaDeDados.LinkToken;
import analiseSemantica.Tipos.TiposSemanticos;
import analiseSintatica.ErroSintaticoException;
import analiseSintatica.Regras.Regra;
import java.util.LinkedList;

/**
 *
 * @author Ivo Romário
 */
public class RegraBloco extends Regra{


    protected static Regra instancia;

    protected String estrutura = "<instrucao> | '{' {<instrucao>} '}'";

    

    /**
     * Construtor privado necessario ao singleton
     */
    private RegraBloco() {
    }

    /**
     * Retorna a unica instancia dessa classe.
     * @return
     */
    public static RegraBloco getInstance() {
        if (instancia == null) {
            instancia = new RegraBloco();
        }
        return (RegraBloco) instancia;
    }

    

    @Override
    public TiposSemanticos analisar(LinkedList<LinkToken> listaTokens) throws ErroSintaticoException {
        
    	if(listaContem(RegraInstrucao.getInstance().getPrimeiro(), listaTokens.getFirst())){
    		return RegraInstrucao.getInstance().analisar(listaTokens);
    	}else{
    		reconheceLexema(listaTokens, "delimitador", "{", estrutura);
    		TiposSemanticos tipos = new TiposSemanticos();
            while(listaContem(RegraInstrucao.getInstance().getPrimeiro(), listaTokens.getFirst())){
            	TiposSemanticos temp = RegraInstrucao.getInstance().analisar(listaTokens);
            	while(temp != null && temp.size() != 0){
            		tipos.addTipos(temp.removeTipos());
            	}
            }
            reconheceLexema(listaTokens, "delimitador", "}", estrutura);
            return tipos;    
         }
    }

    
    @Override
    protected void setPrimeiro() {
        this.primeiro = RegraInstrucao.getInstance().getPrimeiro();
    }
   
}
